// http://poj.org/problem?id=1759

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;

/**
 * 检查给定的 H2 是否可行
 * @param targetH2 第二个灯泡的候选高度
 * @return 如果所有灯泡高度都非负返回 true，否则返回 false
 */
bool check(const double h0, const double targetH2, const int n) {
    double h1 = h0;             // H_{i-1}
    double h2 = targetH2;       // H_i

    // 从第3个灯泡开始递推计算每个灯泡的高度
    for (int i = 3; i <= n; i++) {
        // 根据递推公式: H_i = (H_{i-1} + H_{i+1})/2 - 1
        // 推导出: H_{i+1} = 2*H_i - H_{i-1} + 2
        const double h3 = 2 * h2 - h1 + 2;  // 计算 H_{i+1}

        // 如果出现负高度，说明这个 H2 值太小
        if (h3 < 0) {
            return false;
        }

        // 更新前两个灯泡的高度，为下一次迭代做准备
        h1 = h2;
        h2 = h3;
    }
    return true;  // 所有灯泡高度都非负
}

int main() {
    int n;                          // 灯泡的数量
    double h0;                      // 第一个灯的高度
    scanf("%d%lf", &n, &h0);

    // 二分查找的上下界
    double low = 0;     // H2 的最小可能值
    double high = h0;    // H2 的最大可能值（通常第一个灯泡最高）
    double B = 0;       // 存储最终的最小 B 值

    // 进行 100 次二分迭代，达到足够的精度
    for (int iter = 0; iter < 100; iter++) {
        double mid = (low + high) / 2;  // 取中间值作为 H2 的候选值

        if (check(h0, mid, n)) {
            // 如果 mid 可行，尝试更小的 H2 值
            high = mid;

            // 用可行的 H2 值重新计算整个序列，得到最终的 B
            double h1 = h0, h2 = mid;
            for (int i = 3; i <= n; i++) {
                const double h3 = 2 * h2 - h1 + 2;
                h1 = h2;
                h2 = h3;
            }
            B = h2;  // 记录最后一个灯泡的高度
        } else {
            // 如果 mid 不可行，需要增大 H2
            low = mid;
        }
    }

    // 输出结果，保留两位小数
    // cout << fixed << setprecision(2) << B << endl;
    printf("%.2lf\n", B);

    return 0;
}
/*
692 532.81

446113.34

8 15

9.75
*/